import Vue from 'vue'
import VueStore from '@/store'
import VueRouter from '@/router'
import settings from '@/settings'
import {cleanCache, getMenus, getOauthToken, getRealPath, getToken} from '@/utils/auth'
import {CODE_401} from '@/common/vars'
import {EpMessage as Message} from 'ep-ui'

function isLoginExpire(err) {
    return CODE_401.indexOf(err.data && err.data.code) === -1 && CODE_401.indexOf(err.data && err.data.errorCode) === -1
}

const {whiteList, routePermission, loginWhiteList} = settings

const routeStrategy = {
    allPass: (to, from, next) => {
        next()

        // 如果需要确保进入路由器前都有用户信息
        // let userInfo = VueStore.state.app.userInfo
        // if (userInfo) {
        //   // 用户信息已获取
        //   next()
        // } else {
        //   // 用户信息未获取
        //   VueStore.dispatch('app/getUserInfo').then(res => {
        //     next()
        //   }).catch(err => {
        //     console.log(err);
        //     Message({
        //       type: 'danger',
        //       message: '获取用户信息失败，请尝试刷新'
        //     })
        //   })
        // }
    },

    tokenPass: (to, from, next) => {
        VueStore.commit('app/SETAPPERROR', false)
        let auth = getToken()
        let userInfo = VueStore.state.app.userInfo

        // 判断路径token
        let params = to.query
        let isOauth = VueStore.state.app.isOauth
        let keys = Object.keys(params), tokenKey = ['cmtoken', 'h4atoken', 'eptoken']
        if (keys.length && keys.filter(v => tokenKey.includes(v.toLowerCase())).length) {
            isOauth = true;
            VueStore.commit('app/SETISOAUTH', true)
        }
        if (!auth) {
            //--- 未登录 ---
            if (isOauth) {
                getOauthToken(params)
                next()
            } else if (whiteList.indexOf(to.path) !== -1) {
                // 白名单页面
                next()
            } else {
                // 跳登录页面
                next({
                    path: '/login',
                    query: {
                        redirect: to.fullPath
                    }
                })
                // cookie.setProcessCookie('ep-front-redirect', to.fullPath)
            }
        } else {
            //-- 已登录 ---
            if (to.path === '/login') {
                // 登录页面
                next('/')
            } else if (isOauth) {
                getOauthToken(params)
                next()
            } else if (whiteList.indexOf(to.path) !== -1) {
                // 白名单页面
                next()
            } else if (userInfo) {
                // 用户信息已获取
                next()
            } else {
                // 用户信息未获取
                VueStore.dispatch('app/getUserInfo')
                    .then(res => {
                        next()
                    })
                    .catch(err => {
                        if (isLoginExpire(err)) {
                            VueStore.commit('app/SETAPPERROR', true)
                        }
                        let vm = new Vue()
                        let h = vm.$createElement
                        Message({
                            type: 'danger',
                            duration: 6000,
                            message: (
                                <p>
                                    获取用户信息失败，请尝试刷新 |{' '}
                                    <span onClick={cleanCache} style="color:#4caad4;font-size:12px;cursor: pointer">
                    退出登录
                  </span>
                                </p>
                            )
                        })
                    })
            }
        }
    },

    authPass: (to, from, next) => {
        // todo chunk 的
        VueStore.commit('app/SETAPPERROR', false)
        let auth = getToken()
        let userInfo = VueStore.state.app.userInfo
        // 路由鉴权具体方法
        let judgeRouteAuth = (to, from, next) => {
            let menus = getMenus()
            let routerArr = menus.map(v => v.router) // 用户有权限访问的路由
            let realPath = getRealPath(to) // eg '/form'  则 返回 '/form'，'/form/:id'  则 返回 '/form',
            let appRoutes = VueRouter.getRoutes().map(v => v.path) // 应用所有路由

            if (loginWhiteList.indexOf(realPath) > -1 || routerArr.indexOf(realPath) > -1) {
                // 如果对菜单内的指定字段做硬代码判断 可以在这边做扩展
                // 菜单的过滤可在  menu 的 store SETMENUJSONSTATIC 中进行
                next()
            } else if (appRoutes.indexOf(realPath) === -1) {
                next({
                    path: '/404'
                })
            } else if (routerArr.indexOf(realPath) === -1) {
                next({
                    path: '/401'
                })
            } else if (to.meta.epin || to.meta.chunk) {
                next()
            } else {
                next({
                    path: '/401'
                })
            }
        }

        if (!auth) {
            //--- 未登录 ---

            if (whiteList.indexOf(to.path) !== -1) {
                // 白名单页面
                next()
            } else {
                // 跳登录页面
                next({
                    path: '/login',
                    query: {
                        redirect: to.fullPath
                    }
                })
                // cookie.setProcessCookie('ep-front-redirect', to.fullPath)
            }
        } else {
            //--- 已登录 ---

            if (to.path === '/login') {
                // 登录页面
                next('/')
            } else if (whiteList.indexOf(to.path) !== -1) {
                // 白名单页面
                next()
            } else if (userInfo) {
                // 用户信息已获取
                judgeRouteAuth(to, from, next)
            } else {
                // 用户信息未获取
                VueStore.dispatch('app/getUserInfo')
                    .then(res => {
                        judgeRouteAuth(to, from, next)
                    })
                    .catch(err => {
                        if (isLoginExpire(err)) {
                            VueStore.commit('app/SETAPPERROR', true)
                        }
                        let vm = new Vue()
                        let h = vm.$createElement
                        Message({
                            type: 'danger',
                            duration: 6000,
                            message: (
                                <p>
                                    获取用户信息失败，请尝试刷新 |{' '}
                                    <span onClick={cleanCache} style="color:#4caad4;font-size:12px;cursor: pointer">
                    退出登录
                  </span>
                                </p>
                            )
                        })
                    })
            }
        }
    }
}

/**
 * beforeEach
 * 用于路由拦截
 */
VueRouter.beforeEach(routeStrategy[routePermission])

// export const reqResponseHandler ()
